package com.ferry.transport.api.channel;

import com.ferry.transport.api.Directory;
import com.ferry.transport.api.UnResolvedAddress;

import java.util.List;

/**
 * Created by daiyong
 */
public interface WrappedChannelGroup {

	/**
	 * 远程地址
	 * @return
	 */
	UnResolvedAddress remoteAddress();

	/**
	 * 所管理的下一个wrappedchannel
	 * @return
	 */
	WrappedChannel next();

	/**
	 * 返回所有的 wrappedchannel
	 * @return
	 */
	List<? extends WrappedChannel> channels();

	/**
	 * 是否为空
	 * @return
	 */
	boolean isEmpty();

	/**
	 * 添加WrappedChannel
	 */
	boolean add(WrappedChannel channel);

	/**
	 * 删除 WrappedChannel
	 */
	boolean remove(WrappedChannel channel);

	/**
	 * 返回group 的 大小
	 */
	int size();

	/**
	 * 设置大小
	 */
	void setCapacity(int capacity);

	/**
	 * 获取大小
	 */
	int getCapacity();

	/**
	 * 是否正在重连
	 */
	boolean isConnecting();

	/**
	 * 设置重连状态
	 */
	void setConnecting(boolean connecting);

	/**
	 * 是否可用
	 */
	boolean isAvailable();

	/**
	 * 等待可用
	 */
	boolean waitForAvailable(long timeoutMillis);

	/**
	 * group 可用时候的监听方法
	 */
	void onAvailable(Runnable listener);

	/**
	 *
	 */
	int getWeight(Directory directory);

	/**
	 *
	 */
	void putWeight(Directory directory, int weight);

	/**
	 *
	 */
	void removeWeight(Directory directory);

	/**
	 */
	int getWarmUp();

	/**
	 */
	void setWarmUp(int warmUp);

	/**
	 */
	boolean isWarmUpComplete();

	/**
	 */
	long timestamp();

	/**
	 */
	long deadlineMillis();


}
